﻿using System;
using System.Diagnostics;
using System.Linq;
using System.Collections.Generic;
using ICRprojekt.UcitavanjePitanja;
using System.Windows.Forms;

namespace ICRprojekt
{
    /// <summary>
    /// Klasa regulira tok igre.
    /// </summary>
    class Igra
    {
        private readonly Stopwatch _trajanje_igre = new Stopwatch( );
        private uint _rezultat;
        private Pitanje _aktivno_pitanje;

        public Timer glavni_timer = new Timer();
        private int _ukupni_broj_sekundi = 600;

        public Timer timer_pitanja = new Timer();
        private int _brojac_kratki;


        public void StartIgra( )
        {
            _trajanje_igre.Start( );
        }

        public void KrajIgra()
        {
        }

        public int Ukupni_broj_sekundi
        {
            get { return _ukupni_broj_sekundi; }
            set { _ukupni_broj_sekundi = value; }
        }

        public int Brojac_kratki
        {
            get { return _brojac_kratki; }
            set { _brojac_kratki = value; }
        }

        public Pitanje Aktivno_pitanje
        {
            get { return _aktivno_pitanje; }
            set { _aktivno_pitanje = value; }
        }

        public uint Rezultat
        {
            get { return _rezultat; }
            set { _rezultat = value; }
        }

        /// <summary>
        /// Stvori novu igru.
        /// </summary>
        public List<Pitanje> GenerirajIgru()
        {
            Rezultat = 0;
            _trajanje_igre.Reset( );
            var pitanja = new List<Pitanje>();
            // int zem = 0; int kul = 0; int pov = 0; int spo = 0;

            // kod za dohvat i generiranje random pozicioniranih pitanja na formi
            Random r = new Random ( );
           
            var kategorije = new List<KategorijaPitanja>
                                 {
                                     KategorijaPitanja.Zemljopis,
                                     KategorijaPitanja.Povijest,
                                     KategorijaPitanja.Kultura,
                                     KategorijaPitanja.Sport
                                 };
            foreach (var kat in kategorije)
            {
                var sub_set = DohvatiIzBaze.DohvatiKategoriju(kat);
                for (int i = 0; i < 4; i++)
                {
                    var novo_pitanje = sub_set.ElementAt(r.Next(sub_set.Count));
                    if (!pitanja.Contains(novo_pitanje))
                        pitanja.Add(novo_pitanje);
                    else
                        i--;
                }
            }
            
            // pomjesaj elemente u listi da ne budu poredana pitanja 
            var rand_lista = new List<Pitanje>();
            while (pitanja.Count > 0)
            {
                var indeks = r.Next(pitanja.Count);
                rand_lista.Add(pitanja.ElementAt(indeks));
                pitanja.RemoveAt(indeks);
            }

            return rand_lista;
        }

        /// <summary>
        /// Vraca tocnost odgovora na trenutno pitanje
        /// </summary>
        /// <param name="odgovor">odabrani ili upisani odgovor</param>
        /// <param name="prvo_pitanje">true ako se provjerava prvo pitanje, inace false</param>
        /// <returns>tocnost odgovora</returns>
        public bool ProvjeriOdgovor(string odgovor, bool prvo_pitanje)
        {
            if (prvo_pitanje)
            {
                return _aktivno_pitanje.PrvoTocan == odgovor;
            }
            if (IsNumber(_aktivno_pitanje.DrugoOdgovor))
            {
                return _aktivno_pitanje.DrugoOdgovor == odgovor ? true : false;
            }
                //else
            var slicnost = StringComparer.FaktorSlicnostiOdgovora( _aktivno_pitanje.DrugoOdgovor.ToLower( ), odgovor.ToLower( ) );
            return slicnost >0.85 ? true : false;
        }

        /// <summary>
        /// Metoda provjerava da li je zadani string broj.
        /// </summary>
        /// <param name="odgovor"></param>
        /// <returns></returns>
        public bool IsNumber(string odgovor)
        {
            try
            {
                int.Parse( odgovor );
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}
